package com.concurrent.singleton;

import com.concurrent.annotations.NotThreadSafe;
import com.concurrent.annotations.ThreadSafe;

/**
 * @author: zhouyang
 * @descrpition: 单例模式 懒汉模式 第一次运行的时候初始化 双重同步锁模式 有指令重排的问题
 * @time: 2019-05-05 13:19
 */
@ ThreadSafe
public class SingletonExample4 {
    //私有构造函数 外面就不能new了
    private SingletonExample4(){

    }

    //Cpu指令
    //1.memory = allocate() 分配对象内存空间
    //2.ctorInstance() 初始化对象
    //3.instance = memory 设置instance指向刚分配的空间

    //JVM和cpu优化 发生了指令重排
    //1 3 2


    //单例对象
    private volatile static SingletonExample4 instance = null; //不会出现指令重排 double check

    //静态工厂方法
    public static SingletonExample4 getInstance(){
        //在多个线程中会出错 如果运行多次可能会对资源造成误操作
        if (instance == null){
            synchronized (SingletonExample4.class){//同步锁
                if(instance == null){//双重保证
                    instance = new SingletonExample4();
                }
            }
        }
        return instance;
    }
}
